package main;
/**
 * @author Erica Reis
 */
import exceptions.CaminhoIncorreto;
import exceptions.IndiceInvalido;
import exceptions.NaoEhDiretorio;
import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

public class BuscaArquivo {
	protected Map<String,Float> pastasEValores = new HashMap<String,Float>();
	protected ArrayList<Float> valores;
	protected String[] pastas,listaTemp,listaTemp2;
	protected BufferedReader input;
        protected BufferedWriter output;
	protected File arq;
        protected String strFormatada="", saida, path,separador;
        protected float menor = Integer.MAX_VALUE;
	protected float maior = Integer.MIN_VALUE;
        protected int cont = 0;
	
	public BuscaArquivo(String path) throws CaminhoIncorreto, NaoEhDiretorio{
            if (path == null || path.isEmpty()) {
                throw new CaminhoIncorreto();
            }
            this.path = path;
            this.arq = new File(path);
            if (!arq.isDirectory()) {
                throw new NaoEhDiretorio();
            }
            this.pastas = arq.list();
            this.valores= new ArrayList<Float>();

	}
	public String getCaminho() {
		return this.path;
	}
	public String[] getPastas() {
		Arrays.sort(pastas);
		return this.pastas;
	}
	public ArrayList<Float> getValores() {
		return this.valores;
	}
	public Map<String,Float> getMap() {
		return this.pastasEValores;
	}
        public int getContador() {
            return this.cont;
        }
	private float converteToFloat(String str) {
		float valor = Float.parseFloat(str.substring(25,29));
		return valor;
	}
	private void gravaDados(String caminho) throws IOException{
            String linha2;
            separador = System.getProperty("file.separator");
            float valor;
            try {    
                for (int i=0; i<pastas.length; i++) {
                    
                    input = new BufferedReader(new FileReader(caminho+separador+pastas[i]+separador+"out.pdbqt"));
                    
                    if (input.ready()) {
                        input.readLine();
                        linha2 = input.readLine();
					
                        valor = converteToFloat(linha2);
                        valores.add(valor);
                    }
                    pastasEValores.put(pastas[i], valores.get(i));
                }
            }finally{
                if(input != null) {
                    input.close();
                }
            }  
	}
	public String ordenaSaida() throws IOException{
            gravaDados(path);
            Map<String,Float> mapa = getMap();
            String[] pastas = getPastas();
            saida = "";
            for (int i=0; i<pastas.length; i++) {
		strFormatada += String.format("%.1f --------------------- %s", mapa.get(pastas[i]),pastas[i])+"\n";
            }
            listaTemp = strFormatada.split("\n");
            Arrays.sort(listaTemp);
            for (int i=listaTemp.length-1;i>=0; i--) {
		saida += listaTemp[i]+"\n";
            }
            return saida;
	}
        public String listaMelhores(int num, String str) throws IndiceInvalido {
            listaTemp = str.split("\n");
            if (num > listaTemp.length || num <=0 || String.valueOf(num) == null || String.valueOf(num).isEmpty()) {
                throw new IndiceInvalido();
            }
           saida="";
           for (int i=0; num>cont; i++) {
               saida += listaTemp[i]+"\n";
               if (i+1 < listaTemp.length) {
                   if (!(listaTemp[i].substring(0, 4)).equals(listaTemp[i+1].substring(0, 4))) {
                       cont++;
                   }
               } else {
                   break;
               }
           }
           return saida;
        }
        public String listaPiores(int num, String str) throws IndiceInvalido {
            listaTemp = str.split("\n");
            if (num > listaTemp.length || num <=0 || String.valueOf(num) == null || String.valueOf(num).isEmpty()) {
                throw new IndiceInvalido();
            }
           saida="";
           
           
           for (int i=listaTemp.length-1; num>cont; i--) {
               saida += listaTemp[i]+"\n";
               if (i > 0) {
                   if (!(listaTemp[i].substring(0, 4)).equals(listaTemp[i-1].substring(0, 4))) {
                       cont++;
                   }
               } else {
                   break;
               }
            }
           return saida;

        }
        public void geraConfig() throws IOException{
            separador = System.getProperty("line.separator");
            strFormatada = String.format("receptor = %s"+separador+separador+separador+"center_x = "+separador+"center_y = "+separador+"center_z = "
                    +separador+separador+"size_x = "+separador+"size_y = "+separador+"size_z = ", "teste");
            try {
                output = new BufferedWriter(new FileWriter("/home/ericasdr/config.txt"));
                output.write(strFormatada);
                
            }finally{                
                if(output != null) {
                    output.close();
                }        
            }
        }
}

